# _*_ coding:utf-8 _*_
# @Time  : 2023.03.30
# @Author: zizlee
import json
import datetime
import pathlib
import pandas as pd


# 平仓明细表
class CloseDetailHandler:
    def __init__(self, handle_date: datetime.date):
        self.handle_date = handle_date
        self.handle_date_str = handle_date.strftime('%Y%m%d')
        self.local_file = pathlib.Path(f'平仓明细表/平仓明细查询{self.handle_date_str}.csv')
        self.result_file = pathlib.Path(f'src/CloseDetail/pcmx_{self.handle_date_str}.csv')

    def run(self):
        df = pd.read_csv(self.local_file, encoding='ansi', thousands=',', dtype={0: str, 1: str, 2: str, 9: str, 18: str, 19: str})
        # 取出需要的列并改名
        df.rename(columns={
            '平仓日期': 'ex_date',
            '平仓流水号': 'clp_num',
            '客户号': 'cust_num',
            '客户名称': 'cust_name',
            '交易所': 'exl_name',
            '交易类别': 'ex_kind',
            '席位': 'seat_name',
            '品种': 'variety_name',
            '合约号': 'contract',
            '交割期': 'delivery',
            '买卖': 'direction',
            '手数': 'hands',
            '开仓价格': 'price_open',
            '平仓价格': 'price_close',
            '平仓盈亏（盯）': 'profit_close',
            '平仓盈亏（浮）': 'profit_drift',
            '开仓流水号': 'dto_num',
            '开仓日期': 'date_open',
            '交易编码': 'ex_num',
            '投保': 'protect',
            '平仓类型': 'cl_kind'
        }, inplace=True)
        df = df[df['ex_date'] != '合计']  # 去除平仓日期=合计的
        df['cust_name'].fillna('', inplace=True)
        df['date_open'] = df['date_open'].apply(int)
        cols = ['ex_date', 'cust_num', 'cust_name', 'clp_num', 'exl_name', 'seat_name', 'ex_kind', 'variety_name',
                'delivery', 'contract', 'direction', 'hands', 'price_open', 'price_close', 'profit_drift', 'profit_close',
                'date_open', 'dto_num', 'ex_num', 'cl_kind', 'protect']
        df = df[cols]
        df['ex_date'] = df['ex_date'].apply(lambda x: datetime.datetime.strptime(str(x), '%Y%m%d').strftime('%Y%m%d'))
        df['date_open'] = df['date_open'].apply(lambda x: datetime.datetime.strptime(str(x), '%Y%m%d').strftime('%Y%m%d'))

        str_cols = ['clp_num', 'cust_num', 'cust_name', 'exl_name', 'ex_kind', 'seat_name', 'variety_name',
                    'contract', 'delivery', 'direction', 'dto_num', 'ex_num', 'protect', 'cl_kind']
        for c1 in str_cols:
            df[c1] = df[c1].apply(lambda x: x.strip())  # 处理字段前后空格
        str_cols.append('ex_date')
        str_cols.append('date_open')
        for c2 in cols:
            if c2 not in str_cols:
                df[c2] = df[c2].apply(float)  # 处理字段前后空格

        df.sort_values(by='cust_num', inplace=True)
        df.to_csv(self.result_file, index=False, encoding='utf8')
        print(f'处理{self.handle_date_str}平仓明细表原始文件完成!')


# 成交明细表
class ExchangeDetailHandler:
    def __init__(self, handle_date: datetime.date):
        self.handle_date = handle_date
        self.handle_date_str = handle_date.strftime('%Y%m%d')
        self.local_file = pathlib.Path(f'成交明细表/成交明细查询{self.handle_date_str}.csv')
        self.result_file = pathlib.Path(f'src/ExchangeDetail/cjmx_{self.handle_date_str}.csv')

    def run(self):
        df = pd.read_csv(self.local_file, encoding='ansi', thousands=',', dtype={0: str, 1: str, 12: str, 16: str})
        df.rename(columns={
            '交易日': 'ex_date',
            '客户号': 'cust_num',
            '客户名称': 'cust_name',
            '席位': 'seat_name',
            '投保': 'protect',
            '交易类别': 'ex_kind',
            '成交手数': 'hands',
            '成交价格': 'ex_price',
            '成交额': 'ex_amount',
            '手续费': 'charge',
            '委托类型': 'wt_kind',
            '交易所': 'exl_name',
            '品种': 'variety_name',
            '交割期': 'delivery',
            '合约号': 'contract',
            '买卖': 'direction',
            '开平': 'oc_kind',
            '交易编码': 'ex_num',
            '强平标志': 'close_flag'
        }, inplace=True)
        df = df[df['cust_num'] != '合计']  # 去除平仓日期=合计的
        df['cust_name'].fillna('', inplace=True)
        df['wt_kind'].fillna('', inplace=True)
        cols = ['ex_date', 'cust_num', 'cust_name', 'seat_name', 'protect', 'hands', 'ex_price', 'ex_amount', 'charge',
                'wt_kind', 'exl_name', 'variety_name', 'delivery', 'direction', 'oc_kind', 'ex_num', 'ex_kind',
                'contract', 'close_flag']
        df = df[cols]
        df.sort_values(by='cust_num', inplace=True)
        float_cols = ['hands', 'ex_price', 'ex_amount', 'charge']
        for c1 in float_cols:
            df[c1] = df[c1].apply(float)  # 处理字段类型

        for c2 in cols:
            if c2 not in float_cols:
                df[c2] = df[c2].apply(lambda x: x.strip())  # 处理字段前后空格
        df.sort_values(by='cust_num', inplace=True)
        df.to_csv(self.result_file, index=False, encoding='utf8')
        print(f'处理{self.handle_date_str}成交明细表原始文件完成!')


# 成交单管理
class HistoryExchangeHandler:
    def __init__(self, handle_date: datetime.date):
        self.handle_date = handle_date
        self.handle_date_str = handle_date.strftime('%Y%m%d')
        self.local_file = pathlib.Path(f'历史成交单/成交单管理{self.handle_date_str}.csv')
        self.result_file = pathlib.Path(f'src/HistoryExchange/cjdgl_{self.handle_date_str}.csv')

    @staticmethod
    def parse_variety_en(row):  # 解析品种
        if row.ex_kind == '期货':
            return ''.join(list(filter(lambda s: s.isalpha(), row.contract))).upper()
        elif row.ex_kind == '期权':
            variety = ''.join(list(filter(lambda s: s.isalpha(), row.contract.split('-')[0]))).upper()
            return f'QQ_{variety}'
        elif row.ex_kind == 'TAS':
            return ''.join(list(filter(lambda s: s.isalpha(), row.contract))).upper().replace('TAS', '')
        else:
            raise ValueError(f'{row.ex_kind}-{row.contract}不存在.')

    def run(self):
        if not self.local_file.exists():
            print(f'{self.handle_date_str}历史成交单表原始文件数据不存在!')
            return
        df = pd.read_csv(self.local_file, encoding='ansi', dtype={0: str, 1: str, 2: str}, low_memory=False)
        df = df[df['客户号'] != '总计']
        # 去除含空格的数据
        for col in ['客户名称', '交易所', '交易类别', '品种', '合约号', '买卖', '开平']:
            df[col] = df[col].apply(lambda x: str(x).strip())
        # 检查数字类型数据
        for col in ['手数', '成交价', '成交额', '手续费', '上交手续费']:
            df[col] = df[col].astype(float)
        df.rename(columns={
            '交易日': 'ex_date',
            '成交时间': 'ex_time',
            '客户号': 'cust_num',
            '客户名称': 'cust_name',
            '交易所': 'exl_name',
            '交易类别': 'ex_kind',
            '品种': 'variety_name',
            '合约号': 'contract',
            '买卖': 'direction',
            '开平': 'oc_kind',
            '手数': 'hands',
            '成交价': 'ex_price',
            '成交额': 'ex_amount',
            '手续费': 'charge',
            '上交手续费': 'ex_charge'
        }, inplace=True)
        df.sort_values(by='cust_num', inplace=True)
        df.to_csv(self.result_file, index=False, encoding='utf8')
        print(f'处理{self.handle_date_str}历史成交单原始文件完成!')


# 交易统计表
class ExchangeTotalHandler:
    def __init__(self, handle_date: datetime.date):
        self.handle_date = handle_date
        self.handle_date_str = handle_date.strftime('%Y%m%d')
        self.local_file = pathlib.Path(f'交易统计表/交易统计表{self.handle_date_str}.csv')
        self.result_file = pathlib.Path(f'src/ExchangeTotal/jytj_{self.handle_date_str}.csv')

    def run(self):
        if not self.local_file.exists():
            print(f'{self.handle_date_str}交易统计表原始文件数据不存在!')
            return
        df = pd.read_csv(self.local_file, encoding='ansi', thousands=',', dtype={0: str})
        df.rename(columns={
            '年月': 'ex_date',
            '客户号': 'cust_num',
            '客户名称': 'cust_name',
            '交易所': 'exl_name',
            '品种': 'variety_name',
            '手数': 'hands',
            '成交额': 'ex_amount',
            '平今手数': 'hands_close',
            '平今成交额': 'amount_close',
            '持仓手数': 'hands_holdings',
            '浮动盈亏': 'profit_drift',
            '总盈亏': 'profit',
            '净利润': 'profit_net',
            '保证金': 'fund_bail',
            '交易所保证金': 'fund_bail_exl',
            '手续费': 'charge',
            '上交手续费': 'charge_exl',
            '留存手续费': 'charge_odd',
            '净手续费': 'charge_net',
        }, inplace=True)
        df = df[~df['cust_num'].str.contains('合计|小计')]
        # 添加日期
        df['ex_date'] = self.handle_date_str
        df = df[['ex_date', 'cust_num', 'cust_name', 'exl_name', 'variety_name', 'hands', 'ex_amount', 'hands_close',
                 'amount_close', 'hands_holdings', 'profit_drift', 'profit', 'profit_net', 'fund_bail', 'fund_bail_exl',
                 'charge', 'charge_exl', 'charge_odd', 'charge_net']]
        df.to_csv(self.result_file, index=False, encoding='utf8')
        print(f'处理{self.handle_date_str}交易统计表原始文件完成!')


# 资金对帐表
class FundBalanceHandler:
    def __init__(self, handle_date: datetime.date):
        self.handle_date = handle_date
        self.handle_date_str = handle_date.strftime('%Y%m%d')
        self.local_file = pathlib.Path(f'资金对帐表/客户资金对帐{self.handle_date_str}.csv')
        self.result_file = pathlib.Path(f'src/FundBalance/zjdz_{self.handle_date_str}.csv')

    def run(self):
        if not self.local_file.exists():
            print(f'{self.handle_date_str}资金对账表原始文件数据不存在!')
            return
        df = pd.read_csv(self.local_file, encoding='ansi', thousands=',', dtype={0: str}, low_memory=False)
        df.rename(columns={
            '交易日': 'ex_date',
            '客户号': 'cust_num',
            '客户名称': 'cust_name',
            '上日结存': 'sett_previous',
            '期末权益': 'equity_end',
            '入金': 'fund_in',
            '出金': 'fund_out',
            '客户保证金': 'fund_bail',
            '今日结存': 'sett_current',
            '交易所保证金': 'fund_bail_exl',
            '总盈亏': 'profit',
            '平仓盈亏（盯）': 'profit_close',
            '浮动盈亏（盯）': 'profit_drift',
            '手续费': 'charge',
            '上交手续费': 'charge_exl',
            '留存手续费': 'charge_odd',
            '可用资金': 'fund_avail',
            '净手续费': 'charge_net',
            '浮动盈亏': 'profit_fd'
        }, inplace=True)
        cols = ['ex_date', 'cust_num', 'cust_name', 'sett_previous', 'fund_out', 'fund_in', 'equity_end', 'fund_avail', 'sett_current',
                'fund_bail', 'fund_bail_exl', 'charge', 'charge_exl', 'charge_odd', 'charge_net', 'profit', 'profit_close', 'profit_drift', 'profit_fd']
        df = df[cols]
        df = df[~df['cust_num'].str.contains('合计|小计')]
        df['cust_name'].fillna('', inplace=True)
        # 检查数据格式
        df['ex_date'] = df['ex_date'].apply(lambda x: datetime.datetime.strptime(str(x), '%Y%m%d').strftime('%Y%m%d'))
        str_cols = ['cust_num', 'cust_name']
        for c1 in str_cols:
            df[c1] = df[c1].apply(lambda x: x.strip())
        str_cols.append('ex_date')
        for c2 in cols:
            if c2 not in str_cols:
                df[c2] = df[c2].astype(float)
        df.sort_values(by='cust_num', inplace=True)
        df.to_csv(self.result_file, index=False, encoding='utf8')
        print(f'处理{self.handle_date_str}资金对账表原始文件完成!')


if __name__ == '__main__':
    with open('ex_dates.json', 'r', encoding='utf8') as dtf:
        date_dict = json.load(dtf)

    date_list = date_dict['2022']
    for d in date_list:
        d_date = datetime.date(int(d[0:4]), int(d[4:6]), int(d[6:8]))

        # cjdgl = HistoryExchangeHandler(handle_date=d_date)
        # cjdgl.run()
        #
        # pcmx = CloseDetailHandler(handle_date=d_date)
        # pcmx.run()
        #
        # cjmx = ExchangeDetailHandler(handle_date=d_date)
        # cjmx.run()
        #
        # jytj = ExchangeTotalHandler(handle_date=d_date)
        # jytj.run()

        # zjdz = FundBalanceHandler(handle_date=d_date)
        # zjdz.run()

    jytj = ExchangeTotalHandler(handle_date=datetime.date(2023, 1, 16))
    jytj.run()
